﻿#include "study12.h"
// C/C++ 标准库学习网站：https://legacy.cplusplus.com
// C/C++ 微软(Visual Studio)中文学习网站：https://learn.microsoft.com/zh-cn/cpp/cpp/?view=msvc-170

inline int max_value(int a, int b) {
	return a > b ? a : b;
}

constexpr int sum_two(int a, int b) {
	return a + b;
}

struct Point {
	int x, y;
	constexpr Point(int x, int y)
		: x(x), y(y) { /*printf("Point(%d, %d) constructed\n", x, y); // 可以有，但是外部使用会报错 */
	}
};

int i_global = 10;
int i_global_other = 50;
const int ci_global = 20;
constexpr const int cci_global = 30; // 相当于 const int* const ci_global = 30 的非指针声明

void test_constexpr_inline() {
	using namespace std;

	// 内联函数测试
	int a = 10, b = 20;
	int c = max_value(a, b);
	//int arr[max_value(a, b)]; // err，内联函数不等于常量函数
	cout << "c = " << c << endl;

	// 常量数组、函数测试
	constexpr int arr1[3] = { 1, 2, 3 };
	constexpr int arr2[3] = { 4, 5, 6 };
	constexpr int arr3[sum_two(0, 3)] = { arr1[0] + arr2[0], arr1[1] + arr2[1], arr1[2] + arr2[2] };
	cout << "arr3[0] = " << arr3[0] << endl;

	// 常量类测试
	constexpr Point p1(1, 2);
	enum e1 {
		value1 = p1.x + p1.y,
		value2 = p1.x * p1.y
	};
	cout << "value2 = " << value2 << endl;

	// constexpr 指针测试（引用同理，不做测试）
	cout << "cci_global = " << cci_global << endl;
	constexpr int* pp1 = &i_global; // constexpr int* 相当于 int* const
	//constexpr int* p_global = &ci_global; // 类型对应失败
	//constexpr int* p2 = 15; // err，不能将常量指针指向非常量对象
	//constexpr int* pp3 = &arr1; // err，常量指针不能指向常量数组
	int x1 = 10;
	//constexpr int* pp4 = &x1; // 局部变量的地址需要编译时确定，因此不能用常量指针指向
	cout << "*pp1 = " << *pp1 << endl;
	*pp1 = 100; // ok，指针不能修改
	cout << "i_global = " << i_global << endl;
	constexpr int* pp2 = &i_global_other;
	//pp1 = pp2; // err，指针不可以修改指向
}